package com.lst.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.lst.base.entity.BaseResponse;
import com.lst.common.CommCode;
import com.lst.model.Dynamic;
import com.lst.service.DynamicService;
import com.lst.utils.CommonUtils;
import com.lst.utils.DateUtil;

/**
 * @ClassName: DynamicAddServlet2
 * @Description: 动态添加接口2
 * @author zmm
 * @date 2017年10月25日下午7:44:41
 *
 */
public class DynamicAddServlet2 extends BaseServlet {

	/**
	 * @Fields serialVersionUID
	 */
	private static final long serialVersionUID = 1L;

	private DynamicService dynamicService = ctx.getBean(DynamicService.class);

	 public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
		 
			Date startDate = new Date();
			BaseResponse resPara = new BaseResponse();
			Integer userid = 0;
			Integer dynamicType = 1;
			Integer recordId = 0;
			String content = "";
			String dynamicUrl ="";
			//获取时分秒文件夹地址
			String timeAddr="";
			try {
				timeAddr = DateUtil.getCurrentTime(DateUtil.ALL_DATE_HORIZONTAL);
				//获取工厂地址
				String facAddr = CommonUtils.getImg_file_path_linux() + timeAddr;

				// 创建工厂文件
				File facFile = new File(facAddr);
				if (!facFile.exists()) {
					facFile.mkdirs();
				}
			} catch (ParseException e1) {
				
				e1.printStackTrace();
			}
			//获取工厂地址
			String savePath = CommonUtils.getImg_file_path_linux() + timeAddr;
                 //得到上传文件的保存目录，将上传的文件存放于WEB-INF目录下，不允许外界直接访问，保证上传文件的安全
             //    String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
                 //上传时生成的临时文件保存目录
                 String tempPath = CommonUtils.getTemp_file_path();
                 File tmpFile = new File(tempPath);
                 if (!tmpFile.exists()) {
                     //创建临时目录
                     tmpFile.mkdir();
                 }
                 

                 try{
                     //使用Apache文件上传组件处理文件上传步骤：
                     //1、创建一个DiskFileItemFactory工厂
                     DiskFileItemFactory factory = new DiskFileItemFactory();
                     //设置工厂的缓冲区的大小，当上传的文件大小超过缓冲区的大小时，就会生成一个临时文件存放到指定的临时目录当中。
                     factory.setSizeThreshold(1024*100);//设置缓冲区的大小为100KB，如果不指定，那么缓冲区的大小默认是10KB
                     //设置上传时生成的临时文件的保存目录
                     factory.setRepository(tmpFile);
                     //2、创建一个文件上传解析器
                     ServletFileUpload upload = new ServletFileUpload(factory);
                   
                      //解决上传文件名的中文乱码
                     upload.setHeaderEncoding("UTF-8"); 
                     //3、判断提交上来的数据是否是上传表单的数据
                     if(!ServletFileUpload.isMultipartContent(request)){
                         //按照传统方式获取数据
                    	 Dynamic md = new Dynamic();
     					
     					md.setCreateuser(Integer.valueOf(request.getParameter("userid")));
     					md.setContent(request.getParameter("content"));
     					md.setDynamicType(Integer.valueOf(request.getParameter("dynamicType")));
     					md.setDynamicUrl("");
     					md.setCreatedate(startDate);
     					md.setIsDeleted(false);
     					
     					dynamicService.insert(md);
     					
     					resPara.setCode(CommCode.M_Y000000);
     					resPara.setMessage(CommCode.M_Y000001); 
     					try {
     						response.setContentType("application/json;charset=utf-8");
     						response.setHeader("pragma", "no-cache");
     						response.setHeader("cache-control", "no-cache");

     						Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").excludeFieldsWithoutExposeAnnotation().serializeNulls().create();
     						String jsonResult = gson.toJson(resPara);
     				//		logger.info("DynamicAddServlet jsonResult:" + jsonResult);

     						PrintWriter out = response.getWriter();
     						out.print(jsonResult);
     						out.flush();
     						out.close();

     				//		logger.info("doPost end run(s): " + DateUtil.calLastedTime(startDate));
     					} catch (Exception e) {
     						resPara.setCode(CommCode.M_A000000);
     						resPara.setMessage(CommCode.M_SYS0003);

     						logger.error("doPost error: ", e);
     					}
                         return;
                     }
                     //设置上传单个文件的大小的最大值，目前是设置为1024*1024字节，也就是1MB
                     upload.setFileSizeMax(1024*1024);
                     //设置上传文件总量的最大值，最大值=同时上传的多个文件的大小的最大值的和，目前设置为10MB
                     upload.setSizeMax(1024*1024*10);
                     //4、使用ServletFileUpload解析器解析上传数据，解析结果返回的是一个List<FileItem>集合，每一个FileItem对应一个Form表单的输入项
                     List<FileItem> list = upload.parseRequest(request);
                     List<String> urls =new ArrayList<String>();
                     for(FileItem item : list){
                         //如果fileitem中封装的是普通输入项的数据
                         if(item.isFormField()){
                             String name = item.getFieldName();
                             //解决普通输入项的数据的中文乱码问题
                             String value = item.getString("UTF-8");
                             //value = new String(value.getBytes("iso8859-1"),"UTF-8");
                            if(name.equals("userid")){
                            	userid=Integer.valueOf(value);
                            }
                            if(name.equals("dynamicType")){
                            	dynamicType=Integer.valueOf(value);
                            }
                            if(name.equals("content")){
                            	content=value;
                            }
                            if(name.equals("recordId")){
                            	recordId=Integer.valueOf(value);
                            }
                          //   System.out.println(name + "=" + value);
                         }else{//如果fileitem中封装的是上传文件
                             //得到上传的文件名称，
                             String filename = item.getName();
                           //  System.out.println("文件："+filename);
                             if(filename==null || filename.trim().equals("")){
                                 continue;
                             }
                             //注意：不同的浏览器提交的文件名是不一样的，有些浏览器提交上来的文件名是带有路径的，如：  c:\a\b\1.txt，而有些只是单纯的文件名，如：1.txt
                             //处理获取到的上传文件的文件名的路径部分，只保留文件名部分
                            // filename = filename.substring(filename.lastIndexOf("\\")+1);
                             //得到上传文件的扩展名
                             String fileExtName = filename.substring(filename.lastIndexOf("."));
                             //如果需要限制上传的文件类型，那么可以通过文件的扩展名来判断上传的文件类型是否合法
                        //     System.out.println("上传的文件的扩展名是："+fileExtName);
                             //获取item中的上传文件的输入流
                             InputStream in = item.getInputStream();
                             //得到文件保存的名称
                             String saveFilename = makeFileName(fileExtName);
                             String relPath = CommCode.RESOURCE_URL_IMAGE + timeAddr +"/"+saveFilename;
                             urls.add(relPath);
                             //得到文件的保存目录
                           //  String realSavePath = makePath(saveFilename, savePath);
                          //   System.out.println(savePath);
                             //创建一个文件输出流
                             FileOutputStream out = new FileOutputStream(savePath + "\\" + saveFilename);
                             //创建一个缓冲区
                             byte buffer[] = new byte[1024];
                             //判断输入流中的数据是否已经读完的标识
                             int len = 0;
                             //循环将输入流读入到缓冲区当中，(len=in.read(buffer))>0就表示in里面还有数据
                             while((len=in.read(buffer))>0){
                                 //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中
                                 out.write(buffer, 0, len);
                             }
                             //关闭输入流
                             in.close();
                             //关闭输出流
                             out.close();
                             //删除处理文件上传时生成的临时文件
                           item.delete();
                         }
                     }
                     
                     dynamicUrl = urls.get(0);
						if(urls!=null&&urls.size()>0){
							for(int i=1;i<urls.size();i++){
								dynamicUrl=dynamicUrl+","+urls.get(i);
							}
						} 
                  	Dynamic md = new Dynamic();
 					
 					md.setCreateuser(userid);
 					md.setContent(content);
 					md.setDynamicType(dynamicType);
 					md.setDynamicUrl(dynamicUrl);
 					md.setCreatedate(startDate);
 					md.setIsDeleted(false);
 					md.setRecordId(recordId);
 					
 					dynamicService.insert(md);
 					
 					resPara.setCode(CommCode.M_Y000000);
 					resPara.setMessage(CommCode.M_Y000001); 
 					
                 }catch (FileUploadBase.FileSizeLimitExceededException e) {
                     e.printStackTrace();
                   	 resPara.setCode(CommCode.M_A000000);
					 resPara.setMessage("单个文件超出最大值"); 
                     return;
                 }catch (FileUploadBase.SizeLimitExceededException e) {
                     e.printStackTrace();
                   	 resPara.setCode(CommCode.M_A000000);
					 resPara.setMessage("上传文件的总的大小超出限制的最大值！！！"); 
                     return;
                 }catch (Exception e) {
                   	 resPara.setCode(CommCode.M_A000000);
					 resPara.setMessage("文件上传失败！"); 
                     e.printStackTrace();
                 }
                
                 try {
         			response.setContentType("application/json;charset=utf-8");
         			response.setHeader("pragma", "no-cache");
         			response.setHeader("cache-control", "no-cache");

         			Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").excludeFieldsWithoutExposeAnnotation().serializeNulls().create();
         			String jsonResult = gson.toJson(resPara);
         //			logger.info("DynamicAddServlet2 jsonResult:" + jsonResult);

         			PrintWriter out = response.getWriter();
         			out.print(jsonResult);
         			out.flush();
         			out.close();

         	//		logger.info("doPost end run(s): " + DateUtil.calLastedTime(startDate));
         		} catch (Exception e) {
         			resPara.setCode(CommCode.M_A000000);
         			resPara.setMessage(CommCode.M_SYS0003);

         			logger.error("doPost error: ", e);
         		}
     }
     
     /**
     * @Method: makeFileName
     * @Description: 生成上传文件的文件名，文件名以：uuid+"_"+文件的原始名称
     * @Anthor:孤傲苍狼
     * @param filename 文件的原始名称
     * @return uuid+"_"+文件的原始名称
     */ 
     private String makeFileName(String fileExtName){  //2.jpg
         //为防止文件覆盖的现象发生，要为上传文件产生一个唯一的文件名
       //  return UUID.randomUUID().toString() + "_" + fileExtName;
         return UUID.randomUUID().toString() + fileExtName;
     }
     
     /**
      * 为防止一个目录下面出现太多文件，要使用hash算法打散存储
     * @Method: makePath
     * @Description: 
     * @Anthor:孤傲苍狼
     *
     * @param filename 文件名，要根据文件名生成存储目录
     * @param savePath 文件存储路径
     * @return 新的存储目录
     */ 
//     private String makePath(String filename,String savePath){
//         //得到文件名的hashCode的值，得到的就是filename这个字符串对象在内存中的地址
//         int hashcode = filename.hashCode();
//         int dir1 = hashcode&0xf;  //0--15
//         int dir2 = (hashcode&0xf0)>>4;  //0-15
//         //构造新的保存目录
//         String dir = savePath + "\\" + dir1 + "\\" + dir2;  //upload\2\3  upload\3\5
//         //File既可以代表文件也可以代表目录
//         File file = new File(dir);
//         //如果目录不存在
//         if(!file.exists()){
//             //创建目录
//             file.mkdirs();
//         }
//         return dir;
//     }

     public void doPost(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {

         doGet(request, response);
     }
        
}
